| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 | 1
1
3
1
280
280
280
280
280
280
280
280
1
1
3
3
3
3
1
1
1
1
18
18
3
15
4
11
6
5
2
3
1
1
1
1
1
1
1
1
9
9
9
9
9
1
8
8
7
7
7
1
8
8
1
1
1
| System.register(['aurelia-binding'], function (_export) {
'use strict';
var Parser, ObserverLocator, EventManager, ListenerExpression, BindingExpression, NameExpression, CallExpression, bindingMode, SyntaxInterpreter;
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
return {
setters: [function (_aureliaBinding) {
Parser = _aureliaBinding.Parser;
ObserverLocator = _aureliaBinding.ObserverLocator;
EventManager = _aureliaBinding.EventManager;
ListenerExpression = _aureliaBinding.ListenerExpression;
BindingExpression = _aureliaBinding.BindingExpression;
NameExpression = _aureliaBinding.NameExpression;
CallExpression = _aureliaBinding.CallExpression;
bindingMode = _aureliaBinding.bindingMode;
}],
execute: function () {
SyntaxInterpreter = (function () {
function SyntaxInterpreter(parser, observerLocator, eventManager) {
_classCallCheck(this, SyntaxInterpreter);
this.parser = parser;
this.observerLocator = observerLocator;
this.eventManager = eventManager;
}
SyntaxInterpreter.inject = function inject() {
return [Parser, ObserverLocator, EventManager];
};
SyntaxInterpreter.prototype.interpret = function interpret(resources, element, info, existingInstruction) {
if (info.command in this) {
return this[info.command](resources, element, info, existingInstruction);
}
return this.handleUnknownCommand(resources, element, info, existingInstruction);
};
SyntaxInterpreter.prototype.handleUnknownCommand = function handleUnknownCommand(resources, element, info, existingInstruction) {
var attrName = info.attrName,
command = info.command;
var instruction = this.options(resources, element, info, existingInstruction);
instruction.alteredAttr = true;
instruction.attrName = 'global-behavior';
instruction.attributes.aureliaAttrName = attrName;
instruction.attributes.aureliaCommand = command;
return instruction;
};
SyntaxInterpreter.prototype.determineDefaultBindingMode = function determineDefaultBindingMode(element, attrName) {
var tagName = element.tagName.toLowerCase();
if (tagName === 'input') {
return attrName === 'value' || attrName === 'checked' ? bindingMode.twoWay : bindingMode.oneWay;
} else if (tagName == 'textarea' || tagName == 'select') {
return attrName == 'value' ? bindingMode.twoWay : bindingMode.oneWay;
} else if (attrName === 'textcontent' || attrName === 'innerhtml') {
return element.contentEditable === 'true' ? bindingMode.twoWay : bindingMode.oneWay;
} else if (attrName === 'scrolltop' || attrName === 'scrollleft') {
return bindingMode.twoWay;
}
return bindingMode.oneWay;
};
SyntaxInterpreter.prototype.bind = function bind(resources, element, info, existingInstruction) {
var instruction = existingInstruction || { attrName: info.attrName, attributes: {} };
instruction.attributes[info.attrName] = new BindingExpression(this.observerLocator, this.attributeMap[info.attrName] || info.attrName, this.parser.parse(info.attrValue), info.defaultBindingMode || this.determineDefaultBindingMode(element, info.attrName), resources.valueConverterLookupFunction);
return instruction;
};
SyntaxInterpreter.prototype.trigger = function trigger(resources, element, info) {
return new ListenerExpression(this.eventManager, info.attrName, this.parser.parse(info.attrValue), false, true);
};
SyntaxInterpreter.prototype.delegate = function delegate(resources, element, info) {
return new ListenerExpression(this.eventManager, info.attrName, this.parser.parse(info.attrValue), true, true);
};
SyntaxInterpreter.prototype.call = function call(resources, element, info, existingInstruction) {
var instruction = existingInstruction || { attrName: info.attrName, attributes: {} };
instruction.attributes[info.attrName] = new CallExpression(this.observerLocator, info.attrName, this.parser.parse(info.attrValue), resources.valueConverterLookupFunction);
return instruction;
};
SyntaxInterpreter.prototype.options = function options(resources, element, info, existingInstruction) {
var instruction = existingInstruction || { attrName: info.attrName, attributes: {} },
attrValue = info.attrValue,
language = this.language,
name = null,
target = '',
current,
i,
ii;
for (i = 0, ii = attrValue.length; i < ii; ++i) {
current = attrValue[i];
if (current === ';') {
info = language.inspectAttribute(resources, name, target.trim());
language.createAttributeInstruction(resources, element, info, instruction);
if (!instruction.attributes[info.attrName]) {
instruction.attributes[info.attrName] = info.attrValue;
}
target = '';
name = null;
} else if (current === ':' && name === null) {
name = target.trim();
target = '';
} else {
target += current;
}
}
if (name !== null) {
info = language.inspectAttribute(resources, name, target.trim());
language.createAttributeInstruction(resources, element, info, instruction);
if (!instruction.attributes[info.attrName]) {
instruction.attributes[info.attrName] = info.attrValue;
}
}
return instruction;
};
return SyntaxInterpreter;
})();
_export('SyntaxInterpreter', SyntaxInterpreter);
SyntaxInterpreter.prototype['for'] = function (resources, element, info, existingInstruction) {
var parts, keyValue, instruction, attrValue, isDestructuring;
attrValue = info.attrValue;
isDestructuring = attrValue.match(/[[].+[\]]/);
parts = isDestructuring ? attrValue.split('of ') : attrValue.split(' of ');
if (parts.length !== 2) {
throw new Error('Incorrect syntax for "for". The form is: "$local of $items" or "[$key, $value] of $items".');
}
instruction = existingInstruction || { attrName: info.attrName, attributes: {} };
if (isDestructuring) {
keyValue = parts[0].replace(/[[\]]/g, '').replace(/,/g, ' ').replace(/\s+/g, ' ').trim().split(' ');
instruction.attributes.key = keyValue[0];
instruction.attributes.value = keyValue[1];
} else {
instruction.attributes.local = parts[0];
}
instruction.attributes.items = new BindingExpression(this.observerLocator, 'items', this.parser.parse(parts[1]), bindingMode.oneWay, resources.valueConverterLookupFunction);
return instruction;
};
SyntaxInterpreter.prototype['two-way'] = function (resources, element, info, existingInstruction) {
var instruction = existingInstruction || { attrName: info.attrName, attributes: {} };
instruction.attributes[info.attrName] = new BindingExpression(this.observerLocator, this.attributeMap[info.attrName] || info.attrName, this.parser.parse(info.attrValue), bindingMode.twoWay, resources.valueConverterLookupFunction);
return instruction;
};
SyntaxInterpreter.prototype['one-way'] = function (resources, element, info, existingInstruction) {
var instruction = existingInstruction || { attrName: info.attrName, attributes: {} };
instruction.attributes[info.attrName] = new BindingExpression(this.observerLocator, this.attributeMap[info.attrName] || info.attrName, this.parser.parse(info.attrValue), bindingMode.oneWay, resources.valueConverterLookupFunction);
return instruction;
};
SyntaxInterpreter.prototype['one-time'] = function (resources, element, info, existingInstruction) {
var instruction = existingInstruction || { attrName: info.attrName, attributes: {} };
instruction.attributes[info.attrName] = new BindingExpression(this.observerLocator, this.attributeMap[info.attrName] || info.attrName, this.parser.parse(info.attrValue), bindingMode.oneTime, resources.valueConverterLookupFunction);
return instruction;
};
}
};
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmctYmluZGluZy9zcmMvc3ludGF4LWludGVycHJldGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztpSUFXYSxpQkFBaUI7Ozs7OzsrQkFWNUIsTUFBTTt3Q0FDTixlQUFlO3FDQUNmLFlBQVk7MkNBQ1osa0JBQWtCOzBDQUNsQixpQkFBaUI7dUNBQ2pCLGNBQWM7dUNBQ2QsY0FBYztvQ0FDZCxXQUFXOzs7QUFHQSx1QkFBaUI7QUFFakIsaUJBRkEsaUJBQWlCLENBRWhCLE1BQU0sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFDO2dDQUZ2QyxpQkFBaUI7O0FBRzFCLGNBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLGNBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0FBQ3ZDLGNBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1NBQ2xDOztBQU5VLHlCQUFpQixDQUNyQixNQUFNLEdBQUEsa0JBQUc7QUFBRSxpQkFBTyxDQUFDLE1BQU0sRUFBQyxlQUFlLEVBQUMsWUFBWSxDQUFDLENBQUM7U0FBRTs7QUFEdEQseUJBQWlCLFdBUTVCLFNBQVMsR0FBQSxtQkFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBQztBQUN0RCxjQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFDO0FBQ3RCLG1CQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztXQUMxRTs7QUFFRCxpQkFBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztTQUNqRjs7QUFkVSx5QkFBaUIsV0FnQjVCLG9CQUFv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QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ2pDLFdBQVcsQ0FBQyxPQUFPLEVBQ25CLFNBQVMsQ0FBQyw0QkFBNEIsQ0FDdkMsQ0FBQzs7QUFFSixlQUFPLFdBQVcsQ0FBQztPQUNwQixDQUFDIiwiZmlsZSI6Ii9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmctYmluZGluZy9zcmMvc3ludGF4LWludGVycHJldGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUGFyc2VyLFxuICBPYnNlcnZlckxvY2F0b3IsXG4gIEV2ZW50TWFuYWdlcixcbiAgTGlzdGVuZXJFeHByZXNzaW9uLFxuICBCaW5kaW5nRXhwcmVzc2lvbixcbiAgTmFtZUV4cHJlc3Npb24sXG4gIENhbGxFeHByZXNzaW9uLFxuICBiaW5kaW5nTW9kZVxufSBmcm9tICdhdXJlbGlhLWJpbmRpbmcnO1xuXG5leHBvcnQgY2xhc3MgU3ludGF4SW50ZXJwcmV0ZXIge1xuICBzdGF0aWMgaW5qZWN0KCkgeyByZXR1cm4gW1BhcnNlcixPYnNlcnZlckxvY2F0b3IsRXZlbnRNYW5hZ2VyXTsgfVxuICBjb25zdHJ1Y3RvcihwYXJzZXIsIG9ic2VydmVyTG9jYXRvciwgZXZlbnRNYW5hZ2VyKXtcbiAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB0aGlzLm9ic2VydmVyTG9jYXRvciA9IG9ic2VydmVyTG9jYXRvcjtcbiAgICB0aGlzLmV2ZW50TWFuYWdlciA9IGV2ZW50TWFuYWdlcjtcbiAgfVxuXG4gIGludGVycHJldChyZXNvdXJjZXMsIGVsZW1lbnQsIGluZm8sIGV4aXN0aW5nSW5zdHJ1Y3Rpb24pe1xuICAgIGlmKGluZm8uY29tbWFuZCBpbiB0aGlzKXtcbiAgICAgIHJldHVybiB0aGlzW2luZm8uY29tbWFuZF0ocmVzb3VyY2VzLCBlbGVtZW50LCBpbmZvLCBleGlzdGluZ0luc3RydWN0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVVbmtub3duQ29tbWFuZChyZXNvdXJjZXMsIGVsZW1lbnQsIGluZm8sIGV4aXN0aW5nSW5zdHJ1Y3Rpb24pO1xuICB9XG5cbiAgaGFuZGxlVW5rbm93bkNvbW1hbmQocmVzb3VyY2VzLCBlbGVtZW50LCBpbmZvLCBleGlzdGluZ0luc3RydWN0aW9uKXtcbiAgICB2YXIgYXR0ck5hbWUgPSBpbmZvLmF0dHJOYW1lLFxuICAgICAgICBjb21tYW5kID0gaW5mby5jb21tYW5kO1xuXG4gICAgdmFyIGluc3RydWN0aW9uID0gdGhpcy5vcHRpb25zKHJlc291cmNlcywgZWxlbWVudCwgaW5mbywgZXhpc3RpbmdJbnN0cnVjdGlvbik7XG5cbiAgICBpbnN0cnVjdGlvbi5hbHRlcmVkQXR0ciA9IHRydWU7XG4gICAgaW5zdHJ1Y3Rpb24uYXR0ck5hbWUgPSAnZ2xvYmFsLWJlaGF2aW9yJztcbiAgICBpbnN0cnVjdGlvbi5hdHRyaWJ1dGVzLmF1cmVsaWFBdHRyTmFtZSA9IGF0dHJOYW1lO1xuICAgIGluc3RydWN0aW9uLmF0dHJpYnV0ZXMuYXVyZWxpYUNvbW1hbmQgPSBjb21tYW5kO1xuXG4gICAgcmV0dXJuIGluc3RydWN0aW9uO1xuICB9XG5cbiAgZGV0ZXJtaW5lRGVmYXVsdEJpbmRpbmdNb2RlKGVsZW1lbnQsIGF0dHJOYW1lKXtcbiAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYodGFnTmFtZSA9PT0gJ2lucHV0Jyl7XG4gICAgICByZXR1cm4gYXR0ck5hbWUgPT09ICd2YWx1ZScgfHwgYXR0ck5hbWUgPT09ICdjaGVja2VkJyA/IGJpbmRpbmdNb2RlLnR3b1dheSA6IGJpbmRpbmdNb2RlLm9uZVdheTtcbiAgICB9ZWxzZSBpZih0YWdOYW1lID09ICd0ZXh0YXJlYScgfHwgdGFnTmFtZSA9PSAnc2VsZWN0Jyl7XG4gICAgICByZXR1cm4gYXR0ck5hbWUgPT0gJ3ZhbHVlJyA/IGJpbmRpbmdNb2RlLnR3b1dheSA6IGJpbmRpbmdNb2RlLm9uZVdheTtcbiAgICB9ZWxzZSBpZihhdHRyTmFtZSA9PT0gJ3RleHRjb250ZW50JyB8fCBhdHRyTmFtZSA9PT0gJ2lubmVyaHRtbCcpe1xuICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScgPyBiaW5kaW5nTW9kZS50d29XYXkgOiBiaW5kaW5nTW9kZS5vbmVXYXk7XG4gICAgfSBlbHNlIGlmKGF0dHJOYW1lID09PSAnc2Nyb2xsdG9wJyB8fCBhdHRyTmFtZSA9PT0gJ3Njcm9sbGxlZnQnKXtcbiAgICAgIHJldHVybiBiaW5kaW5nTW9kZS50d29XYXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJpbmRpbmdNb2RlLm9uZVdheTtcbiAgfVxuXG4gIGJpbmQocmVzb3VyY2VzLCBlbGVtZW50LCBpbmZvLCBleGlzdGluZ0luc3RydWN0aW9uKXtcbiAgICB2YXIgaW5zdHJ1Y3Rpb24gPSBleGlzdGluZ0luc3RydWN0aW9uIHx8IHthdHRyTmFtZTppbmZvLmF0dHJOYW1lLCBhdHRyaWJ1dGVzOnt9fTtcblxuICAgIGluc3RydWN0aW9uLmF0dHJpYnV0ZXNbaW5mby5hdHRyTmFtZV0gPSBuZXcgQmluZGluZ0V4cHJlc3Npb24oXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJMb2NhdG9yLFxuICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcFtpbmZvLmF0dHJOYW1lXSB8fCBpbmZvLmF0dHJOYW1lLFxuICAgICAgICB0aGlzLnBhcnNlci5wYXJzZShpbmZvLmF0dHJWYWx1ZSksXG4gICAgICAgIGluZm8uZGVmYXVsdEJpbmRpbmdNb2RlIHx8IHRoaXMuZGV0ZXJtaW5lRGVmYXVsdEJpbmRpbmdNb2RlKGVsZW1lbnQsIGluZm8uYXR0ck5hbWUpLFxuICAgICAgICByZXNvdXJjZXMudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvblxuICAgICAgKTtcblxuICAgIHJldHVybiBpbnN0cnVjdGlvbjtcbiAgfVxuXG4gIHRyaWdnZXIocmVzb3VyY2VzLCBlbGVtZW50LCBpbmZvKXtcbiAgICByZXR1cm4gbmV3IExpc3RlbmVyRXhwcmVzc2lvbihcbiAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyLFxuICAgICAgaW5mby5hdHRyTmFtZSxcbiAgICAgIHRoaXMucGFyc2VyLnBhcnNlKGluZm8uYXR0clZhbHVlKSxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBkZWxlZ2F0ZShyZXNvdXJjZXMsIGVsZW1lbnQsIGluZm8pe1xuICAgIHJldHVybiBuZXcgTGlzdGVuZXJFeHByZXNzaW9uKFxuICAgICAgdGhpcy5ldmVudE1hbmFnZXIsXG4gICAgICBpbmZvLmF0dHJOYW1lLFxuICAgICAgdGhpcy5wYXJzZXIucGFyc2UoaW5mby5hdHRyVmFsdWUpLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgY2FsbChyZXNvdXJjZXMsIGVsZW1lbnQsIGluZm8sIGV4aXN0aW5nSW5zdHJ1Y3Rpb24pe1xuICAgIHZhciBpbnN0cnVjdGlvbiA9IGV4aXN0aW5nSW5zdHJ1Y3Rpb24gfHwge2F0dHJOYW1lOmluZm8uYXR0ck5hbWUsIGF0dHJpYnV0ZXM6e319O1xuXG4gICAgaW5zdHJ1Y3Rpb24uYXR0cmlidXRlc1tpbmZvLmF0dHJOYW1lXSA9IG5ldyBDYWxsRXhwcmVzc2lvbihcbiAgICAgICAgdGhpcy5vYnNlcnZlckxvY2F0b3IsXG4gICAgICAgIGluZm8uYXR0ck5hbWUsXG4gICAgICAgIHRoaXMucGFyc2VyLnBhcnNlKGluZm8uYXR0clZhbHVlKSxcbiAgICAgICAgcmVzb3VyY2VzLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb25cbiAgICAgICk7XG5cbiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247XG4gIH07XG5cbiAgb3B0aW9ucyhyZXNvdXJjZXMsIGVsZW1lbnQsIGluZm8sIGV4aXN0aW5nSW5zdHJ1Y3Rpb24pe1xuICAgIHZhciBpbnN0cnVjdGlvbiA9IGV4aXN0aW5nSW5zdHJ1Y3Rpb24gfHwge2F0dHJOYW1lOmluZm8uYXR0ck5hbWUsIGF0dHJpYnV0ZXM6e319LFxuICAgICAgICBhdHRyVmFsdWUgPSBpbmZvLmF0dHJWYWx1ZSxcbiAgICAgICAgbGFuZ3VhZ2UgPSB0aGlzLmxhbmd1YWdlLFxuICAgICAgICBuYW1lID0gbnVsbCwgdGFyZ2V0ID0gJycsIGN1cnJlbnQsIGkgLCBpaTtcblxuICAgIGZvcihpID0gMCwgaWkgPSBhdHRyVmFsdWUubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBjdXJyZW50ID0gYXR0clZhbHVlW2ldO1xuXG4gICAgICBpZihjdXJyZW50ID09PSAnOycpe1xuICAgICAgICBpbmZvID0gbGFuZ3VhZ2UuaW5zcGVjdEF0dHJpYnV0ZShyZXNvdXJjZXMsIG5hbWUsIHRhcmdldC50cmltKCkpO1xuICAgICAgICBsYW5ndWFnZS5jcmVhdGVBdHRyaWJ1dGVJbnN0cnVjdGlvbihyZXNvdXJjZXMsIGVsZW1lbnQsIGluZm8sIGluc3RydWN0aW9uKTtcblxuICAgICAgICBpZighaW5zdHJ1Y3Rpb24uYXR0cmlidXRlc1tpbmZvLmF0dHJOYW1lXSl7XG4gICAgICAgICAgaW5zdHJ1Y3Rpb24uYXR0cmlidXRlc1tpbmZvLmF0dHJOYW1lXSA9IGluZm8uYXR0clZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0ID0gJyc7XG4gICAgICAgIG5hbWUgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmKGN1cnJlbnQgPT09ICc6JyAmJiBuYW1lID09PSBudWxsKXtcbiAgICAgICAgbmFtZSA9IHRhcmdldC50cmltKCk7XG4gICAgICAgIHRhcmdldCA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ICs9IGN1cnJlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYobmFtZSAhPT0gbnVsbCl7XG4gICAgICBpbmZvID0gbGFuZ3VhZ2UuaW5zcGVjdEF0dHJpYnV0ZShyZXNvdXJjZXMsIG5hbWUsIHRhcmdldC50cmltKCkpO1xuICAgICAgbGFuZ3VhZ2UuY3JlYXRlQXR0cmlidXRlSW5zdHJ1Y3Rpb24ocmVzb3VyY2VzLCBlbGVtZW50LCBpbmZvLCBpbnN0cnVjdGlvbik7XG5cbiAgICAgIGlmKCFpbnN0cnVjdGlvbi5hdHRyaWJ1dGVzW2luZm8uYXR0ck5hbWVdKXtcbiAgICAgICAgaW5zdHJ1Y3Rpb24uYXR0cmlidXRlc1tpbmZvLmF0dHJOYW1lXSA9IGluZm8uYXR0clZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnN0cnVjdGlvbjtcbiAgfVxufVxuXG5TeW50YXhJbnRlcnByZXRlci5wcm90b3R5cGVbJ2ZvciddID0gZnVuY3Rpb24ocmVzb3VyY2VzLCBlbGVtZW50LCBpbmZvLCBleGlzdGluZ0luc3RydWN0aW9uKXtcbiAgdmFyIHBhcnRzLCBrZXlWYWx1ZSwgaW5zdHJ1Y3Rpb24sIGF0dHJWYWx1ZSwgaXNEZXN0cnVjdHVyaW5nO1xuICBhdHRyVmFsdWUgPSBpbmZvLmF0dHJWYWx1ZTtcbiAgaXNEZXN0cnVjdHVyaW5nID0gYXR0clZhbHVlLm1hdGNoKC9bW10uK1tcXF1dLyk7XG4gIHBhcnRzID0gaXNEZXN0cnVjdHVyaW5nID8gYXR0clZhbHVlLnNwbGl0KCdvZiAnKSA6IGF0dHJWYWx1ZS5zcGxpdCgnIG9mICcpO1xuXG4gIGlmKHBhcnRzLmxlbmd0aCAhPT0gMil7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3Qgc3ludGF4IGZvciBcImZvclwiLiBUaGUgZm9ybSBpczogXCIkbG9jYWwgb2YgJGl0ZW1zXCIgb3IgXCJbJGtleSwgJHZhbHVlXSBvZiAkaXRlbXNcIi4nKTtcbiAgfVxuXG4gIGluc3RydWN0aW9uID0gZXhpc3RpbmdJbnN0cnVjdGlvbiB8fCB7YXR0ck5hbWU6aW5mby5hdHRyTmFtZSwgYXR0cmlidXRlczp7fX07XG5cbiAgaWYoaXNEZXN0cnVjdHVyaW5nKXtcbiAgICBrZXlWYWx1ZSA9IHBhcnRzWzBdLnJlcGxhY2UoL1tbXFxdXS9nLCAnJykucmVwbGFjZSgvLC9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkuc3BsaXQoJyAnKTtcbiAgICBpbnN0cnVjdGlvbi5hdHRyaWJ1dGVzLmtleSA9IGtleVZhbHVlWzBdO1xuICAgIGluc3RydWN0aW9uLmF0dHJpYnV0ZXMudmFsdWUgPSBrZXlWYWx1ZVsxXTtcbiAgfWVsc2V7XG4gICAgaW5zdHJ1Y3Rpb24uYXR0cmlidXRlcy5sb2NhbCA9IHBhcnRzWzBdO1xuICB9XG5cbiAgaW5zdHJ1Y3Rpb24uYXR0cmlidXRlcy5pdGVtcyA9IG5ldyBCaW5kaW5nRXhwcmVzc2lvbihcbiAgICB0aGlzLm9ic2VydmVyTG9jYXRvcixcbiAgICAnaXRlbXMnLFxuICAgIHRoaXMucGFyc2VyLnBhcnNlKHBhcnRzWzFdKSxcbiAgICBiaW5kaW5nTW9kZS5vbmVXYXksXG4gICAgcmVzb3VyY2VzLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb25cbiAgKTtcblxuICByZXR1cm4gaW5zdHJ1Y3Rpb247XG59O1xuXG5TeW50YXhJbnRlcnByZXRlci5wcm90b3R5cGVbJ3R3by13YXknXSA9IGZ1bmN0aW9uKHJlc291cmNlcywgZWxlbWVudCwgaW5mbywgZXhpc3RpbmdJbnN0cnVjdGlvbil7XG4gIHZhciBpbnN0cnVjdGlvbiA9IGV4aXN0aW5nSW5zdHJ1Y3Rpb24gfHwge2F0dHJOYW1lOmluZm8uYXR0ck5hbWUsIGF0dHJpYnV0ZXM6e319O1xuXG4gIGluc3RydWN0aW9uLmF0dHJpYnV0ZXNbaW5mby5hdHRyTmFtZV0gPSBuZXcgQmluZGluZ0V4cHJlc3Npb24oXG4gICAgICB0aGlzLm9ic2VydmVyTG9jYXRvcixcbiAgICAgIHRoaXMuYXR0cmlidXRlTWFwW2luZm8uYXR0ck5hbWVdIHx8IGluZm8uYXR0ck5hbWUsXG4gICAgICB0aGlzLnBhcnNlci5wYXJzZShpbmZvLmF0dHJWYWx1ZSksXG4gICAgICBiaW5kaW5nTW9kZS50d29XYXksXG4gICAgICByZXNvdXJjZXMudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvblxuICAgICk7XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uO1xufTtcblxuU3ludGF4SW50ZXJwcmV0ZXIucHJvdG90eXBlWydvbmUtd2F5J10gPSBmdW5jdGlvbihyZXNvdXJjZXMsIGVsZW1lbnQsIGluZm8sIGV4aXN0aW5nSW5zdHJ1Y3Rpb24pe1xuICB2YXIgaW5zdHJ1Y3Rpb24gPSBleGlzdGluZ0luc3RydWN0aW9uIHx8IHthdHRyTmFtZTppbmZvLmF0dHJOYW1lLCBhdHRyaWJ1dGVzOnt9fTtcblxuICBpbnN0cnVjdGlvbi5hdHRyaWJ1dGVzW2luZm8uYXR0ck5hbWVdID0gbmV3IEJpbmRpbmdFeHByZXNzaW9uKFxuICAgICAgdGhpcy5vYnNlcnZlckxvY2F0b3IsXG4gICAgICB0aGlzLmF0dHJpYnV0ZU1hcFtpbmZvLmF0dHJOYW1lXSB8fCBpbmZvLmF0dHJOYW1lLFxuICAgICAgdGhpcy5wYXJzZXIucGFyc2UoaW5mby5hdHRyVmFsdWUpLFxuICAgICAgYmluZGluZ01vZGUub25lV2F5LFxuICAgICAgcmVzb3VyY2VzLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb25cbiAgICApO1xuXG4gIHJldHVybiBpbnN0cnVjdGlvbjtcbn07XG5cblN5bnRheEludGVycHJldGVyLnByb3RvdHlwZVsnb25lLXRpbWUnXSA9IGZ1bmN0aW9uKHJlc291cmNlcywgZWxlbWVudCwgaW5mbywgZXhpc3RpbmdJbnN0cnVjdGlvbil7XG4gIHZhciBpbnN0cnVjdGlvbiA9IGV4aXN0aW5nSW5zdHJ1Y3Rpb24gfHwge2F0dHJOYW1lOmluZm8uYXR0ck5hbWUsIGF0dHJpYnV0ZXM6e319O1xuXG4gIGluc3RydWN0aW9uLmF0dHJpYnV0ZXNbaW5mby5hdHRyTmFtZV0gPSBuZXcgQmluZGluZ0V4cHJlc3Npb24oXG4gICAgICB0aGlzLm9ic2VydmVyTG9jYXRvcixcbiAgICAgIHRoaXMuYXR0cmlidXRlTWFwW2luZm8uYXR0ck5hbWVdIHx8IGluZm8uYXR0ck5hbWUsXG4gICAgICB0aGlzLnBhcnNlci5wYXJzZShpbmZvLmF0dHJWYWx1ZSksXG4gICAgICBiaW5kaW5nTW9kZS5vbmVUaW1lLFxuICAgICAgcmVzb3VyY2VzLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb25cbiAgICApO1xuXG4gIHJldHVybiBpbnN0cnVjdGlvbjtcbn07XG4iXX0= |